#include "lv_timer.h"
#include <stdlib.h>

/* 定时器调度链表头（所有激活的定时器通过链表管理） */
static lv_timer_t *timer_list = NULL;

/* 初始化定时器模块
 * 功能：初始化调度链表（清空链表）
 */
void lv_timer_init(void) {
    timer_list = NULL;
}

/* 创建定时器
 * 功能：分配内存并初始化定时器参数
 */
lv_timer_t *lv_timer_create(lv_timer_cb_t cb, uint32_t period, void *user_data, bool is_repeat) {
    /* 参数校验：回调函数必须存在，周期必须>0 */
    if (cb == NULL || period == 0) {
        return NULL;
    }

    /* 分配定时器内存（若需无动态内存，可改为静态数组） */
    lv_timer_t *timer = (lv_timer_t *)malloc(sizeof(lv_timer_t));
    if (timer == NULL) {
        return NULL; /* 内存分配失败 */
    }

    /* 初始化定时器成员 */
    timer->next = NULL;          /* 初始不加入链表 */
    timer->cb = cb;              /* 绑定回调函数 */
    timer->user_data = user_data;/* 保存用户数据 */
    timer->period = period;      /* 定时周期 */
    timer->remaining = period;   /* 初始剩余时间=周期 */
    timer->is_repeat = is_repeat;/* 周期模式标志 */
    timer->active = false;       /* 初始为未激活状态 */

    return timer;
}

/* 启动定时器
 * 功能：将定时器加入调度链表，标记为激活
 */
void lv_timer_start(lv_timer_t *timer) {
    if (timer == NULL || timer->active) {
        return; /* 无效定时器或已激活，直接返回 */
    }

    /* 重置剩余时间（从周期重新开始计时） */
    timer->remaining = timer->period;
    /* 标记为激活 */
    timer->active = true;

    /* 将定时器插入链表头部（头插法：新定时器优先处理） */
    timer->next = timer_list;
    timer_list = timer;
}

/* 停止定时器
 * 功能：将定时器从调度链表移除，标记为未激活
 */
void lv_timer_stop(lv_timer_t *timer) {
    if (timer == NULL || !timer->active) {
        return; /* 无效定时器或已停止，直接返回 */
    }

    /* 从链表中移除定时器 */
    if (timer_list == timer) {
        /* 若为链表头，直接更新头指针 */
        timer_list = timer->next;
    } else {
        /* 遍历链表找到前一个节点 */
        lv_timer_t *prev = timer_list;
        while (prev != NULL && prev->next != timer) {
            prev = prev->next;
        }
        /* 若找到前一个节点，跳过当前节点 */
        if (prev != NULL) {
            prev->next = timer->next;
        }
    }

    /* 标记为未激活 */
    timer->active = false;
    timer->next = NULL; /* 断开链表连接 */
}

/* 删除定时器
 * 功能：停止定时器并释放内存
 */
void lv_timer_del(lv_timer_t *timer) {
    if (timer == NULL) {
        return;
    }
    /* 先停止定时器（确保从链表移除） */
    lv_timer_stop(timer);
    /* 释放内存 */
    free(timer);
}

/* 定时器心跳函数
 * 功能：处理所有激活的定时器，更新剩余时间并触发回调
 * 注意：必须周期性调用，参数为两次调用的时间间隔（毫秒）
 */
void lv_timer_handler(uint32_t elapsed_ms) {
    if (elapsed_ms == 0) {
        return; /* 时间间隔必须>0，否则退出 */
    }

    lv_timer_t *current = timer_list;
    lv_timer_t *prev = NULL;

    while (current != NULL) {
        /* 保存下一个节点（防止回调中删除当前节点导致链表断裂） */
        lv_timer_t *next = current->next;

        /* 仅处理激活的定时器 */
        if (current->active) {
            /* 减去流逝的时间 */
            if (current->remaining > elapsed_ms) {
                current->remaining -= elapsed_ms;
            } else {
                /* 剩余时间不足，触发回调 */
                current->remaining = 0;

                /* 执行回调函数，获取下一次触发的延时（仅周期模式有效） */
                uint32_t new_period = current->cb(current->user_data);

                /* 处理定时模式 */
                if (current->is_repeat) {
                    /* 周期模式：若回调返回有效周期则更新，否则沿用原周期 */
                    current->period = (new_period > 0) ? new_period : current->period;
                    current->remaining = current->period; /* 重置剩余时间 */
                } else {
                    /* 单次模式：触发后自动停止 */
                    lv_timer_stop(current);
                }
            }
        }

        /* 移动到下一个节点 */
        prev = current;
        current = next;
    }
}